AWS ParallelCluster Slurm アカウンティング設定に必要なリソースを AWS CDK で作成してみた

AWS ParallelCluster Slurm アカウンティング設定に必要なリソースを AWS CDK で作成してみた

Clock Icon2024.09.25

AWS ParallelCluster で Slurm Accounting を設定する際に必要なデータベースを構築するための AWS CDK(TypeScript)のサンプルコードを紹介します。

SlurmAccountingCDK

背景

AWS ParallelCluster の Slurm Accounting 設定には一部分かりづらい項目があります。特に Secrets Manager に保存するパスワードは、一般的な Key/Value 形式ではなく、プレーンテキストでの保存が必要です。

この点については以前のブログ記事で解説しました。今回は Slurm Accounting に必要なリソースを一括でデプロイできる Infrastructure as Code (IaC) のコードを用意しました。

https://dev.classmethod.jp/articles/aws-parallelcluster-slurm-accounting-setup-guide/

作成するリソース

CDK のコードでデプロイする主なリソースは以下の 2 つです。

  1. Secrets Manager(ランダム生成されたパスワードを保存)
  2. Amazon RDS for MySQL

SlurmAccountingCDK(1)

サンプルコード

AWS CDK のサンプルコードは以下のリンクから参照できます。

https://github.com/bigmuramura/slurm-accounting-db

Secrets Manager と RDS の設定説明

Slurm DB 用のパスワード

AWS ParallelCluster の Slurm Accounting 設定の仕様上、パスワードはプレーンテキストで保存する必要があります。一般的な Key/Value 形式で保存すると ParallelCluster が正しく読み取れません。

パスワードはランダム生成して Secrets Manager に保存しています。

    // Secrets Manager でプレーンテキストパスワードを生成
    const dbPasswordSecret = new secretsmanager.Secret(this, 'SlurmDBPlaintextPassword', {
      secretName: 'slurmdb-password',
      description: 'Plaintext password for Slurm DB MySQL instance',
      generateSecretString: {
        passwordLength: 30,
        excludePunctuation: true,
        includeSpace: false,
        requireEachIncludedType: true,
      },
    });

RDS のセキュリティグループ

RDS のセキュリティグループのインバウンドルールは VPC の CIDR から許可しています。必要応じてより厳しく制限してください。

    // セキュリティグループの作成
    const securityGroup = new ec2.SecurityGroup(this, 'SlurmDbSecurityGroup', {
      vpc: vpc,
      description: 'Security group for Slurm DB',
      allowAllOutbound: true,
    });

    // VPC CIDR からのインバウンドトラフィックを許可
    securityGroup.addIngressRule(
      ec2.Peer.ipv4(props.vpcCidr),
      ec2.Port.tcp(3306),
      'Allow MySQL access from VPC'
    );

RDS の設定

低コスト運用のため db.t4g.micro インスタンスを非冗長構成で作成します。便利な Performance Insight にも対応していないタイプです。

MySQL のユーザー名はadmin、パスワードは Secrets Manager に保存されたランダム生成のパスワードを使用して DB をセットアップします。

    // RDS インスタンスの作成
    const dbInstance = new rds.DatabaseInstance(this, 'SlurmDbInstance', {
      engine: rds.DatabaseInstanceEngine.mysql({ version: rds.MysqlEngineVersion.VER_8_0_39 }),
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T4G, ec2.InstanceSize.MICRO), // メモ: t4g.micro は Performance Insights 非対応のタイプ
      vpc: vpc,
      vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
      subnetGroup: subnetGroup,
      securityGroups: [securityGroup],
      allocatedStorage: 20,
      storageType: rds.StorageType.GP3,
      storageEncrypted: true,
      databaseName: 'slurmdb',
      credentials: rds.Credentials.fromPassword('admin', dbPasswordSecret.secretValue),
      removalPolicy: cdk.RemovalPolicy.DESTROY, // 注意: 本番環境では RETAIN を検討してください
      deletionProtection: false, // 注意: 本番環境では true を検討してください
      parameterGroup: parameterGroup,
      optionGroup: optionGroup,
      backupRetention: cdk.Duration.days(7),
      preferredBackupWindow: '20:00-21:00', // UTC (JST 毎日 5:00-6:00)
      preferredMaintenanceWindow: 'sun:21:00-sun:22:00', // UTC (JST 日曜日 6:00-7:00)
    });

設定値

デプロイ後の RDS の設定画面を参考までに載せておきます。

データベースの詳細_-_RDS_マネジメントコンソール-2

データベースの詳細_-_RDS_マネジメントコンソール-3

クラスターの設定

クラスターの設定ファイルで、Slurm Accounting に必要なリソース名を指定します。
CDK により生成された CloudFormation のアウトプットには、RDS のエンドポイント名と Secrets Manager の ARN が表示されるのでこれらの値をコピペするのが手っ取り早いです。

config.yaml
Scheduling:
  Scheduler: slurm # Slurm を指定
  SlurmSettings:
    ScaledownIdletime: 10
    # --- Slurm Accounting 設定 ---
    Database:
      Uri: slumdb.hogehoge.ap-northeast-1.rds.amazonaws.com:3306 # RDS のエンドポイントとデータベース名とポート番号を指定
      UserName: admin # RDS のユーザー名を指定
      PasswordSecretArn: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:slurmdb-hoge # Secrets Manager の ARN を指定

ちなみに MySQL のパスワードについては直接入力する場面がないため、Secrets Manager に保存されているパスワードを知らないままでもクラスターは構築できます。

動作確認

クラスター作成後、ヘッドノードにログインしてsacctコマンドを実行します。テストジョブが完了した結果が RDS へ保存されるようになりました。

$ sacct
JobID           JobName  Partition    Account  AllocCPUS      State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
1               test.sh         p1  pcdefault          1  COMPLETED      0:0
1.batch           batch             pcdefault          1  COMPLETED      0:0

まとめ

本記事では、AWS ParallelCluster の Slurm Accounting に必要なリソースを構築するための AWS CDK サンプルコードを紹介しました。

おわりに

今回 AWS CDK のコード内でパスワードをランダム生成しました。AWS CDK もとより CloudFormation でパスワード生成できることをはじめて知りました。あとは Key/Value 形式にしないで Secrets Manager に文字列を保存する方法がわからなく時間を溶かしました。どなたかのお役にたてば幸いです。

https://dev.classmethod.jp/articles/automatically-generate-a-password-with-cloudformation/

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.